# -*- Mode: makefile -*-
#
# TCG tests (per-target rules)
#
# This Makefile fragment is included from the build-tcg target, once
# for each target we build. We have two options for compiling, either
# using a configured guest compiler or calling one of our docker images
# to do it for us.
#

# The configure script fills in extra information about
# useful docker images or alternative compiler flags.

# Usage: $(call quiet-command,command and args,"NAME","args to print")
# This will run "command and args", and either:
#  if V=1 just print the whole command and args
#  otherwise print the 'quiet' output in the format "  NAME     args to print"
# NAME should be a short name of the command, 7 letters or fewer.
# If called with only a single argument, will print nothing in quiet mode.
quiet-command-run = $(if $(V),,$(if $2,printf "  %-7s %s\n" $2 $3 && ))$1
quiet-@ = $(if $(V),,@)
quiet-command = $(quiet-@)$(call quiet-command-run,$1,$2,$3)

CROSS_CC_GUEST:=
CROSS_AS_GUEST:=
CROSS_LD_GUEST:=
DOCKER_IMAGE:=

-include tests/tcg/config-$(TARGET).mak

GUEST_BUILD=
TCG_MAKE=../Makefile.target

# We also need the Docker make rules to depend on
SKIP_DOCKER_BUILD=1
include $(SRC_PATH)/tests/docker/Makefile.include

# Support installed Cross Compilers

ifdef CROSS_CC_GUEST

.PHONY: cross-build-guest-tests
cross-build-guest-tests:
	$(call quiet-command, \
	   (mkdir -p tests/tcg/$(TARGET) && cd tests/tcg/$(TARGET) && \
	    $(MAKE) -f $(TCG_MAKE) TARGET="$(TARGET)" CC="$(CROSS_CC_GUEST)" \
			$(if $(CROSS_AS_GUEST),AS="$(CROSS_AS_GUEST)") \
			$(if $(CROSS_LD_GUEST),LD="$(CROSS_LD_GUEST)") \
			SRC_PATH="$(SRC_PATH)" BUILD_STATIC=$(CROSS_CC_GUEST_STATIC) \
			EXTRA_CFLAGS="$(CROSS_CC_GUEST_CFLAGS)"), \
	"BUILD","$(TARGET) guest-tests with $(CROSS_CC_GUEST)")

GUEST_BUILD=cross-build-guest-tests

endif

# Support building with Docker

ifneq ($(DOCKER_IMAGE),)

DOCKER_COMPILE_CMD="$(DOCKER_SCRIPT) cc \
		--cc $(DOCKER_CROSS_CC_GUEST) \
		-i qemu/$(DOCKER_IMAGE) \
		-s $(SRC_PATH) -- "

DOCKER_AS_CMD=$(if $(DOCKER_CROSS_AS_GUEST),"$(DOCKER_SCRIPT) cc \
		--cc $(DOCKER_CROSS_AS_GUEST) \
		-i qemu/$(DOCKER_IMAGE) \
		-s $(SRC_PATH) -- ")

DOCKER_LD_CMD=$(if $(DOCKER_CROSS_LD_GUEST),"$(DOCKER_SCRIPT) cc \
		--cc $(DOCKER_CROSS_LD_GUEST) \
		-i qemu/$(DOCKER_IMAGE) \
		-s $(SRC_PATH) -- ")


.PHONY: docker-build-guest-tests
docker-build-guest-tests: docker-image-$(DOCKER_IMAGE)
	$(call quiet-command, \
	  (mkdir -p tests/tcg/$(TARGET) && cd tests/tcg/$(TARGET) && \
	   $(MAKE) -f $(TCG_MAKE) TARGET="$(TARGET)" CC=$(DOCKER_COMPILE_CMD) \
			$(if $(DOCKER_AS_CMD),AS=$(DOCKER_AS_CMD)) \
			$(if $(DOCKER_LD_CMD),LD=$(DOCKER_LD_CMD)) \
			SRC_PATH="$(SRC_PATH)" BUILD_STATIC=y \
			EXTRA_CFLAGS="$(CROSS_CC_GUEST_CFLAGS)"), \
	"BUILD","$(TARGET) guest-tests with docker qemu/$(DOCKER_IMAGE)")

GUEST_BUILD=docker-build-guest-tests

endif

# Final targets
all:
	@echo "Do not invoke this Makefile directly"; exit 1

.PHONY: guest-tests

ifneq ($(GUEST_BUILD),)
guest-tests: $(GUEST_BUILD)

run-guest-tests: guest-tests
	$(call quiet-command, \
	(cd tests/tcg/$(TARGET) && \
	 $(MAKE) -f $(TCG_MAKE) TARGET="$(TARGET)" \
	 		SRC_PATH="$(SRC_PATH)" SPEED=$(SPEED) run), \
	"RUN", "tests for $(TARGET_NAME)")

else
guest-tests:
	$(call quiet-command, true, "BUILD", \
		"$(TARGET) guest-tests SKIPPED")

run-guest-tests:
	$(call quiet-command, true, "RUN", \
		"tests for $(TARGET) SKIPPED")
endif

# It doesn't matter if these don't exits
.PHONY: clean-guest-tests
clean-guest-tests:
	rm -rf tests/tcg/$(TARGET)
